/*
 * @Author: WJC 
 * @Date: 2018-12-03 15:13:12 
 * @Last Modified by: WJC
 * @Last Modified time: 2018-12-04 14:02:31
 */

// 声明全局变量
var payInoInput; // "退费发票号"输入框
var pidInput; // "身份证号"输入框
var payIno2Input; // "收费发票号"输入框
var caseNoInput; // "病例号"输入框
var pnameInput; // "姓名"输入框
var settleTypeInput; // "结算类别"输入框
var payInput; // "总金额"、"实付金额"和"现金支付"输入框
var pay2Input; // "账户支付"和"报销金额"输入框
var flag; // 退费药品数量的输入判断

/**
 * 获取全局变量
 */
function getGlobalVariable() {
    payInoInput = $('input[name="pay_ino"]');
    payIno2Input = $('input[name="pay_ino2"]');
    pidInput = $('input[name="pid"]');
    caseNoInput = $('input[name="case_no"]');
    pnameInput = $('input[name="pname"]');
    settleTypeInput = $('input[name="settle_type"]');
    payInput = $('input[name="pay"]');
    pay2Input = $('input[name="pay2"]');
}

/**
 * 将不足10位的数值，转换为长度为10的字符串
 * @param {number} num 
 */
function getTenStr(num) {
    // 将num转换成字符串，根据字符串长度获得正确的数值位数
    var str = num + "";
    var len = str.length;
    // 根据字符串长度进行位数补全，补全到10位，不足位添0
    if (len < 10) {
        for (var i = 0; i < 10 - len; i++) {
            str = "0" + str;
        }
    }
    return str;
}

/**
 * 输入检测样式
 */
function checkStyle(obj, flag) {
    if (flag) {
        $(obj).css("border", "1px solid rgb(169, 169, 169)");
    } else {
        $(obj).css("border", "1px solid red");
    }
}

/**
 * 表单验证工具对象
 */
var checkUtil = {
    // 未输入检测
    checkNoInput: function (obj) {
        // 直接传入表单控件时，获取控件内容
        if (typeof obj !== "string") {
            obj = obj.val();
        }

        if (obj === "" || obj === null || obj === undefined) {
            // 没有有输入内容
            //alert("未输入");
            return false;
        }
        return true;
    },

    // 输入长度检测
    checkLength: function (obj, len) {
        // 直接传入表单控件时，获取控件内容
        if (typeof obj !== "string") {
            obj = obj.val();
        }

        if (obj.length !== len) {
            // 字符串不是10位
            //alert("输入长度不是" + len + "位");
            return false;
        }
        return true;
    },

    // 数字格式检测
    checkNumber: function (obj, len) {
        // 直接传入表单控件时，获取控件内容
        if (typeof obj !== "string") {
            obj = obj.val();
        }

        // 发票号的正则表达式
        var s = "^\\d{" + len + "}$";
        var format = new RegExp(s);

        // 根据正则表达式判断输入发票号是否正确
        if (!format.test(obj)) {
            //alert("输入格式不正确");
            return false;
        }
        return true;
    },

    // 日期格式检测
    checkDateFormat: function (obj) {
        // 直接传入表单控件时，获取控件内容
        if (typeof obj !== "string") {
            obj = obj.val();
        }

        // 日期的正则表达式
        var format = /^((19|20)\d\d)-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])$/;

        // 根据正则表达式判断输入日期格式是否正确
        if (!format.test(obj)) {
            //alert("日期格式不正确，格式“yyyy-MM-dd");
            return false;
        }
        return true;
    },

    // 身份证号格式检测
    checkIDCardFormat: function (obj) {
        // 直接传入表单控件时，获取控件内容
        if (typeof obj !== "string") {
            obj = obj.val();
        }

        // 身份证号位数检测
        var len = obj.length;
        if (len !== 15 && len !== 18) {
            //alert("身份证号位数不正确");
            return false;
        }

        // 身份证号的正则表达式
        var format15 = /^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$/;
        var format18 = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;

        // 根据正则表达式判断输入身份证号格式是否正确
        switch (len) {
            case 15:
                // 15位身份证号检测
                if (!format15.test(obj)) {
                    //alert("身份证号格式不正确");
                    return false;
                }
                break;

            case 18:
                // 18位身份证号检测
                if (!format18.test(obj)) {
                    //alert("身份证号格式不正确");
                    return false;
                }
                break;
        }
        return true;
    },

    // 下拉列表检测
    checkSelect: function (obj) {
        // 直接传入表单控件时，获取控件内容
        if (typeof obj !== "string") {
            obj = obj.val();
        }

        if (obj === "0" || obj === "" || obj === null || obj === undefined) {
            //alert("没有选择选项");
            return false;
        }
        return true;
    }
};

/**
 * 传入name为pid的input输入值，通过该输入值获取服务器端的对应身份证信息
 * @param {string} pidValue
 */
function queryIdCardInfoByPid(pidValue) {
    // 当pid的值为空字符串时不执行函数
    if (pidValue === "") {
        return;
    }

    // 通过AJAX获得数据
    $.ajax({
        url: "getIdCardInfo.do",
        type: "post",
        async: true,
        data: {
            pid: pidValue
        },
        dataType: "text",
        error: function () {
            alert("身份证号的ajax请求失败");
        },
        success: function (data) {
            // num的值为-1时，表示数据库中该记录不存在
            var num = parseInt(data);
            if (num !== -1) {
                var json = eval("(" + data + ")"); // string->json
                pnameInput.val(json.pname); // 添加"姓名"
            } else {
                // 消除上一次残留记录
                pnameInput.val("");
            }
        }
    });
}

/**
 * 获得当前可用的最新退费发票号，并为"退费发票号"输入框的value属性赋值
 */
function getPayIno() {
    // 通过AJAX获得数据
    $.ajax({
        url: "getRequiredPayIno.do",
        type: "post",
        async: true,
        error: function () {
            alert("退费发票号的ajax请求失败");
        },
        success: function (data) {
            // 1、将获得的data数据转换成数值类型num
            var num = parseInt(data);
            // 2、如果num的值为-1，表示发票号超出范围，弹出警告，并结束函数
            if (num === -1) {
                alert("退费发票号溢出，请联系技术人员");
                return;
            }
            // 3、将不足10位的数值，转换为长度为10的字符串
            var str = getTenStr(num);

            // 为"退费发票号"输入框的value属性赋值
            payInoInput.val(str);
        }
    });
}

/**
 * 通过"收费发票号"获得信息
 */
function getInfoByPay2Ino() {
    $.ajax({
        type: "post",
        url: "getInfoByPayIno2.do",
        data: {
            payIno2: payIno2Input.val()
        },
        dataType: "text",
        error: function () {
            alert("单据号查询的ajax请求失败");
        },
        success: function (data) {
            var num = parseInt(data);

            if (num == -1) {
                alert("无法获取数据");
                return;
            }

            var json = eval("(" + data + ")");
            //console.log(json);
            pidInput.val(json.pid);
            caseNoInput.val(getTenStr(json.caseNo));
            pnameInput.val(json.pname);
            settleTypeInput.val(json.settleType);
            payInput.val(json.pay);
            pay2Input.val(0);

            $("tbody").empty();
            var list = json.list;
            for (var i = 0; i < list.length; i++) {
                addTrIntoTbody(i + 1, list[i][0], list[i][1], list[i][2], list[i][3], list[i][4], list[i][5], list[i][6]);
            }
        }
    });
}

/**
 * 通过"病例号"获得信息
 */
function getInfoByCaseNo() {
    $.ajax({
        type: "post",
        url: "getInfoByCaseNo.do",
        data: {
            caseNo: caseNoInput.val()
        },
        dataType: "text",
        error: function () {
            alert("病例号查询的ajax请求失败");
        },
        success: function (data) {
            var num = parseInt(data);

            if (num == -1) {
                alert("无法获取数据");
                return;
            }

            var json = eval("(" + data + ")");
            //console.log(json);
            pidInput.val(json.pid);
            payIno2Input.val(getTenStr(json.payIno2));
            pnameInput.val(json.pname);
            settleTypeInput.val(json.settleType);
            payInput.val(json.pay);
            pay2Input.val(0);

            $("tbody").empty();
            var list = json.list;
            for (var i = 0; i < list.length; i++) {
                addTrIntoTbody(i + 1, list[i][0], list[i][1], list[i][2], list[i][3], list[i][4], list[i][5], list[i][6]);
            }
        }
    });
}

/**
 * 向"收费明细"表格添加行
 */
function addTrIntoTbody(count, dgname, spec, pdprice, payNum, backPayNum, dguit, drugno) {
    $("tbody").append(
        "<tr><td>" +
        count + "</td><td>" +
        dgname + "</td><td>" +
        spec + "</td><td>" +
        pdprice + "</td><td class='pdprice'>" +
        pdprice + "</td><td class='payNum'>" +
        payNum + "</td><td>" +
        dguit + "</td><td class='backPayNum'>" +
        backPayNum +
        "</td><td><input type='text' name='back_num' value='0' onblur='computeMoney(this);checkBackNum(this);' /></td><td class='back_pay1'></td><td class='back_pay2'></td><td>否</td><td class='drugno' style='display:none;'>" +
        drugno + "</td></tr>"
    );
}

/**
 * 计算退费金额
 */
function computeMoney(obj) {
    var pdprice = $(obj).parent().parent().children(".pdprice").html();
    var sum = pdprice * $(obj).val();
    $(obj).parent().parent().children(".back_pay1").html(sum);
    $(obj).parent().parent().children(".back_pay2").html(sum);
}

/**
 * 退费数量判断
 */
function checkBackNum(obj) {
    var num = parseInt($(obj).val()); // 退费数量
    var max = $(obj).parent().parent().children(".payNum").html();
    console.log("num: " + num + ", max: " + max);
    if (!isNaN(num) && num >= 0 && num <= max) {
        checkStyle(obj, true);
        flag = true;
    } else {
        checkStyle(obj, false);
        flag = false;
    }
}

/**
 * 退费操作
 * @param {number} type 
 * type为1，全退
 * type为2，部分退
 */
function backPay(type) {
    // 药品判断
    if ($("tbody tr").length === 0) {
        alert("没有药品退费");
        return;
    }

    // 输入判断
    if (!flag) {
        alert("退费数量输入错误");
        return;
    }

    // 传输数据
    var payIno = payInoInput.val(); // 退费发票号
    var caseNo = caseNoInput.val(); // 病例号
    var remark = payIno2Input.val(); // 相应的收费发票号
    var payMoney = 0; // 退费总额
    var drugnoArr = []; // 药品编号数组
    var payNumArr = []; // 退药数量数组
    var pdpriceArr = []; // 退药单个总价数组
    // 退费总额计算
    var trs = $("tbody tr"); // tbody下所有的行
    if (type === 1) {
        // 全退
        for (var i = 0; i < trs.length; i++) {
            var tr = $(trs.get(i));
            var drugno = tr.children(".drugno").html(); // 药品编号
            var backPayNum = parseFloat(tr.children(".backPayNum").html()); // 药品数量
            var pdprice = parseFloat(tr.children(".pdprice").html());  // 药品单价

            payMoney += (backPayNum * pdprice);
            drugnoArr.push(drugno);
            payNumArr.push(backPayNum);
            pdpriceArr.push(backPayNum * pdprice);
        }
    } else if (type === 2) {
        // 部分退
        for (var i = 0; i < trs.length; i++) {
            var tr = $(trs.get(i));
            var drugno = tr.children(".drugno").html(); // 药品编号
            var backNum = parseInt(tr.children("td").children("input[name='back_num']").val()); // 药品数量
            var pdprice = parseFloat(tr.children(".pdprice").html());  // 药品单价
            
            payMoney += parseFloat(tr.children(".back_pay2").html());
            drugnoArr.push(drugno);
            payNumArr.push(backNum);
            pdpriceArr.push(backNum * pdprice);
        }  
    }

    console.log(payIno +" | "+ caseNo + " | " + remark + " | " + payMoney + " | " + drugnoArr + " | " + payNumArr + " | " + pdpriceArr);

    $.ajax({
        type: "post",
        url: "backPay.do",
        data: {
            payIno: payIno,
            caseNo: caseNo,
            remark: remark,
            payMoney: payMoney,
            drugnoArr: drugnoArr,
            payNumArr: payNumArr,
            pdpriceArr: pdpriceArr
        },
        traditional: true,
        error: function () {
            alert("退费的ajax失败");
        },
        success: function (data) {
            var num = parseInt(data);
            if (num == -1) {
                alert("请更新发票号");
            } else if (num == -2) {
                alert("退费失败");
            } else {
                alert("退费成功");
            }
        }
    });
}


/**
 * 绑定事件
 */
function bindEvent() {
    /** "退费发票号"输入框绑定事件 */
    payInoInput.blur(function () {
        // "退费发票号"检测
        var flag = checkUtil.checkNumber($(this), 10);

        checkStyle(this, flag);
    });

    /** "收费发票号"输入框绑定事件 */
    payIno2Input.blur(function () {
        // "收费发票号"检测
        var flag = checkUtil.checkNumber($(this), 10);

        checkStyle(this, flag);
    });
    payIno2Input.keyup(function (e) {
        var eCode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
        // 回车键的keyCode为13，按下回车后执行函数
        if (eCode === 13) {
            getInfoByPay2Ino();
        }
    });

    /** "身份证号"输入框绑定事件 */
    pidInput.keyup(function (e) {
        var eCode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
        // 回车键的keyCode为13，按下回车后执行函数
        if (eCode === 13) {
            queryIdCardInfoByPid(this.value);
        }
    });
    pidInput.blur(function () {
        // "身份证号"检测
        var flag = checkUtil.checkIDCardFormat($(this));

        checkStyle(this, flag);

        if (flag) {
            queryIdCardInfoByPid(this.value);
        }
    });

    /**"病例号"输入框绑定事件 */
    caseNoInput.blur(function () {
        // "病例号"检测
        var flag = checkUtil.checkNumber($(this), 10);
        checkStyle(this, flag);
    });
    caseNoInput.keyup(function (e) {
        var eCode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
        // 回车键的keyCode为13，按下回车后执行函数
        if (eCode === 13) {
            getInfoByCaseNo();
        }
    });

    // "更新发票号"按钮的绑定事件
    $('.refresh_ino').click(function () {
        getPayIno();
    });

    // "全退"按钮的绑定事件
    $(".back_all_btn").click(function () {
        backPay(1);
    });

    // "保存"按钮的绑定事件
    $(".save_btn").click(function () {
        backPay(2);
    });

    // "清屏"按钮的绑定事件
    $(".clear_form").click(function () {
        payIno2Input.val("");
        pidInput.val("");
        caseNoInput.val("");
        pnameInput.val("");
        settleTypeInput.val("");
        payInput.val("");
        pay2Input.val("");
        $("tbody").empty();
    });

}

/**
 * 在网页加载完时，执行相应的函数
 */
$(document).ready(function () {
    // 获得全局变量
    getGlobalVariable();
    // 获得当前可用的最新退费发票号
    getPayIno();
    // 绑定事件
    bindEvent();
});